package ar.com.psicosoft.model.psicosoft_admin;

import java.io.Serializable;

import javax.persistence.*;

import ar.com.psicosoft.model.psicosoft.EstadoCivil;
import ar.com.psicosoft.model.psicosoft.NivelEstudio;
import ar.com.psicosoft.model.psicosoft.Persona;
import ar.com.psicosoft.model.psicosoft.Profesional;
import ar.com.psicosoft.model.psicosoft_datos_anexos.Localidad;

import java.sql.Date;
import java.sql.Timestamp;

/**
 * The persistent class for the usuario database table.
 * 
 */
@Entity
@Table(name = "usuario", schema = "psicosoft_admin")
@NamedQueries({
		@NamedQuery(name = "Usuario.buscarPorId", query = "SELECT u FROM Usuario u WHERE u.idPersona = :idPersona"),
		@NamedQuery(name = "Usuario.buscarPorLogin", query = "SELECT u FROM Usuario u WHERE u.login = :login"),
		@NamedQuery(name = "Usuario.validarUsuario", query = "SELECT u from Usuario u WHERE u.login = :login and u.clave = :clave"),
		@NamedQuery(name = "Usuario.buscarUsuarios", query = "SELECT u FROM Usuario u ORDER BY u.login"),
		@NamedQuery(name = "Usuario.eliminarUsuarioPorId", query = "DELETE FROM Usuario u WHERE u.idPersona = :idPersona") })
@PrimaryKeyJoinColumn(name = "\"idPersona\"")
public class Usuario extends Persona implements Serializable {

	private static final long serialVersionUID = 1L;

	@Column(nullable = false)
	private Boolean admin;

	@Column(name = "\"caducidadContrasena\"")
	private Timestamp caducidadContrasena;

	@Column(nullable = false, length = 30)
	private String clave;

	@Column(name = "\"intentosFallidos\"", nullable = false)
	private Integer intentosFallidos;

	@Column(nullable = false, length = 320, unique = true)
	private String login;

	@Column(nullable = false, length = 40)
	private String profesion;

	// bi-directional many-to-many association to Servicio
	// @ManyToMany
	// @JoinTable(name = "permiso" joinColumns = {"\"idPersona\""},
	// inverseJoinColumns = {"\"idServicio_servicio\""})
	// private List<Servicio> servicios;

	// uni-directional one-to-one association to Persona
	@OneToOne(fetch = FetchType.EAGER, targetEntity = Persona.class, cascade = CascadeType.ALL, optional = false)
	@JoinColumn(name = "\"idPersona\"", unique = true, nullable = false, insertable = false, updatable = false)
	private Persona persona;

	// bi-directional many-to-one association to Empresa
	@ManyToOne(fetch = FetchType.EAGER, targetEntity = Empresa.class, cascade = {
			CascadeType.MERGE, CascadeType.REFRESH }, optional = false)
	@JoinColumn(name = "\"idEmpresa\"", unique = true, nullable = false, insertable = true, updatable = false)
	private Empresa empresa;

	// bi-directional one-to-one association to Profesional
	@OneToOne(fetch = FetchType.EAGER, targetEntity = Profesional.class, cascade = CascadeType.ALL, optional = true)
	@JoinColumn(name = "\"idPersona\"", unique = true, nullable = true, insertable = true, updatable = false)
	private Profesional profesional;

	public Usuario() {
	}

	/**
	 * @param nombrePersona
	 * @param apellidoPersona
	 * @param cuilCuit
	 * @param direccion
	 * @param dni
	 * @param email
	 * @param fechaNacimiento
	 * @param sexo
	 * @param idLocalidad
	 * @param login
	 * @param clave
	 * @param creacion
	 * @param admin
	 * @param intentosFallidos
	 */
	public Usuario(String nombrePersona, String apellidoPersona,
			String cuilCuit, String direccion, String dni, String email,
			Date fechaNacimiento, String sexo, EstadoCivil estadoCivil,
			NivelEstudio nivelEstudio, Localidad localidad, Timestamp creacion,
			String login, String clave, Boolean admin,
			Integer intentosFallidos, String profesion, Empresa empresa) {
		super(nombrePersona, apellidoPersona, cuilCuit, direccion, dni, email,
				fechaNacimiento, sexo, estadoCivil, nivelEstudio, localidad,
				creacion);
		this.login = login;
		this.clave = clave;
		this.admin = admin;
		this.intentosFallidos = intentosFallidos;
		this.profesion = profesion;
		this.empresa = empresa;
	}

	public Boolean getAdmin() {
		return this.admin;
	}

	public void setAdmin(Boolean admin) {
		this.admin = admin;
	}

	public Timestamp getCaducidadContrasena() {
		return this.caducidadContrasena;
	}

	public void setCaducidadContrasena(Timestamp caducidadContrasena) {
		this.caducidadContrasena = caducidadContrasena;
	}

	public String getClave() {
		return this.clave;
	}

	public void setClave(String clave) {
		this.clave = clave;
	}

	public Integer getIntentosFallidos() {
		return this.intentosFallidos;
	}

	public void setIntentosFallidos(Integer intentosFallidos) {
		this.intentosFallidos = intentosFallidos;
	}

	public String getLogin() {
		return this.login;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	/*
	 * public List<Servicio> getServicios() { return this.servicios; }
	 * 
	 * public void setServicios(List<Servicio> servicios) { this.servicios =
	 * servicios; }
	 */

	public Persona getPersona() {
		return persona;
	}

	public void setPersona(Persona persona) {
		this.persona = persona;
	}

	public Empresa getEmpresa() {
		return empresa;
	}

	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}

	public Profesional getProfesional() {
		return profesional;
	}

	public void setProfesional(Profesional profesional) {
		this.profesional = profesional;
	}

	public String getProfesion() {
		return profesion;
	}

	public void setProfesion(String profesion) {
		this.profesion = profesion;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = super.hashCode();
		result = prime * result + ((admin == null) ? 0 : admin.hashCode());
		result = prime
				* result
				+ ((caducidadContrasena == null) ? 0 : caducidadContrasena
						.hashCode());
		result = prime * result + ((clave == null) ? 0 : clave.hashCode());
		result = prime * result + ((login == null) ? 0 : login.hashCode());
		return result;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (!super.equals(obj))
			return false;
		if (getClass() != obj.getClass())
			return false;
		Usuario other = (Usuario) obj;
		if (admin == null) {
			if (other.admin != null)
				return false;
		} else if (!admin.equals(other.admin))
			return false;
		if (caducidadContrasena == null) {
			if (other.caducidadContrasena != null)
				return false;
		} else if (!caducidadContrasena.equals(other.caducidadContrasena))
			return false;
		if (clave == null) {
			if (other.clave != null)
				return false;
		} else if (!clave.equals(other.clave))
			return false;
		if (login == null) {
			if (other.login != null)
				return false;
		} else if (!login.equals(other.login))
			return false;
		return true;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Usuario [login=" + login + ", admin=" + admin
				+ ", caducidadContrasena=" + caducidadContrasena + "]";
	}

}